package decorator;

/**
 *              ┌───────────┐
 *              │ Component │
 *              └───────────┘
 *                    ▲
 *       ┌────────────┼─────────────────┐
 *       │            │                 │
 * ┌───────────┐┌───────────┐     ┌───────────┐
 * │ComponentA ││ComponentB │...  │ Decorator │
 * └───────────┘└───────────┘     └───────────┘
 *                                      ▲
 *                               ┌──────┴──────┐
 *                               │             │
 *                         ┌───────────┐ ┌───────────┐
 *                         │DecoratorA │ │DecoratorB │...
 *                         └───────────┘ └───────────┘
 */

/**
 * 把核心功能和附加功能给分开
 * 核心功能指FileInputStream这些真正读数据的源头，附加功能指加缓冲、压缩、解密这些功能。
 * 如果我们要新增核心功能，就增加Component的子类，例如ByteInputStream。
 * 如果我们要增加附加功能，就增加Decorator的子类，例如CipherInputStream。
 * 两部分都可以独立地扩展，而具体如何附加功能，由调用方自由组合，从而极大地增强了灵活性。
 */
public class Test {
    public static void main(String[] args) {
        TextNode n1 = new SpanNode();
        n1.setText("Hello");
        System.out.println(n1.getText());

        System.out.println("------------------------------");

        TextNode n2 = new BoldDecorator(n1);
        n2.setText("Bold");
        System.out.println(n2.getText());

        System.out.println("------------------------------");

        TextNode n3 = new UnderlineDecorator(n2);
        n3.setText("Bold and Underline");
        System.out.println(n3.getText());

    }
}